package com.example.myweather.Adapter

import android.content.Intent
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.AsyncListDiffer
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.example.myweather.Activity.MainActivity
import com.example.myweather.databinding.CityViewholderBinding
import com.example.myweather.model.CityResponseApi

class CityAdapter:RecyclerView.Adapter<CityAdapter.ViewHolder>() {
    private lateinit var binding: CityViewholderBinding

    inner class ViewHolder:RecyclerView.ViewHolder(binding.root)
    // 创建新的 ViewHolder，当 RecyclerView 需要一个新的视图时调用
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CityAdapter.ViewHolder {
        // 获取布局填充器
        val inflater=LayoutInflater.from(parent.context)
        // 使用布局填充器实例化 CityViewholderBinding 对象
        binding= CityViewholderBinding.inflate(inflater,parent,false)
        // 创建并返回 ViewHolder 实例
        return ViewHolder()
    }
    // 将数据绑定到 ViewHolder 上，当 RecyclerView 需要展示一个位置的数据时调用
    override fun onBindViewHolder(holder: CityAdapter.ViewHolder, position: Int) {
        // 获取当前位置的城市数据对象
        val binding=CityViewholderBinding.bind(holder.itemView)
        // 设置城市名称文本
        binding.cityTxt.text=differ.currentList[position].name
        // 设置列表项的点击事件监听器
        binding.root.setOnClickListener{
            // 创建包含城市经纬度和名称的 Intent
            val intent=Intent(binding.root.context,MainActivity::class.java)
            intent.putExtra("lat",differ.currentList[position].lat)
            intent.putExtra("lon",differ.currentList[position].lon)
            intent.putExtra("name",differ.currentList[position].name)
            // 启动 MainActivity 并传递 Intent
            binding.root.context.startActivity(intent)
        }
    }
    // 返回当前列表项的数量
    override fun getItemCount()=differ.currentList.size
    // DiffUtil 回调，用于比较列表项数据的差异
    private val differCallback=object :DiffUtil.ItemCallback<CityResponseApi.CityResponseApiItem>(){
        // 判断两个对象是否表示同一个项目（通常是通过唯一标识符）
        override fun areItemsTheSame(
            oldItem: CityResponseApi.CityResponseApiItem,
            newItem: CityResponseApi.CityResponseApiItem
        ): Boolean {
            return oldItem==newItem // 假设每个城市都有唯一的 id
        }
        // 判断两个对象的内容是否完全相同
        override fun areContentsTheSame(
            oldItem: CityResponseApi.CityResponseApiItem,
            newItem: CityResponseApi.CityResponseApiItem
        ): Boolean {
            return oldItem==newItem// 如果整个对象都相等
        }
    }
    // AsyncListDiffer 对象，用于管理列表数据集合和进行差异更新
    val differ=AsyncListDiffer(this,differCallback)
}